<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License. 
-->
<html>
<head>
    <link type="text/css" rel="stylesheet" href="https://struts.apache.org/css/default.css">
    <style type="text/css">
        .dp-highlighter {
            width:95% !important;
        }
    </style>
    <style type="text/css">
        .footer {
            background-image:      url('https://cwiki.apache.org/confluence/images/border/border_bottom.gif');
            background-repeat:     repeat-x;
            background-position:   left top;
            padding-top:           4px;
            color:                 #666;
        }
    </style>
    <link href='https://struts.apache.org/highlighter/style/shCoreStruts.css' rel='stylesheet' type='text/css' />
    <link href='https://struts.apache.org/highlighter/style/shThemeStruts.css' rel='stylesheet' type='text/css' />
    <script src='https://struts.apache.org/highlighter/js/shCore.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushPlain.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushXml.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushJava.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushJScript.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushGroovy.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushBash.js' type='text/javascript'></script>
    <script type="text/javascript">
        SyntaxHighlighter.defaults['toolbar'] = false;
        SyntaxHighlighter.all();
    </script>
    <script type="text/javascript" language="javascript">
        var hide = null;
        var show = null;
        var children = null;

        function init() {
            /* Search form initialization */
            var form = document.forms['search'];
            if (form != null) {
                form.elements['domains'].value = location.hostname;
                form.elements['sitesearch'].value = location.hostname;
            }

            /* Children initialization */
            hide = document.getElementById('hide');
            show = document.getElementById('show');
            children = document.all != null ?
                    document.all['children'] :
                    document.getElementById('children');
            if (children != null) {
                children.style.display = 'none';
                show.style.display = 'inline';
                hide.style.display = 'none';
            }
        }

        function showChildren() {
            children.style.display = 'block';
            show.style.display = 'none';
            hide.style.display = 'inline';
        }

        function hideChildren() {
            children.style.display = 'none';
            show.style.display = 'inline';
            hide.style.display = 'none';
        }
    </script>
    <title>Default Workflow Interceptor</title>
</head>
<body onload="init()">
<table border="0" cellpadding="2" cellspacing="0" width="100%">
    <tr class="topBar">
        <td align="left" valign="middle" class="topBarDiv" align="left" nowrap>
            &nbsp;<a href="home.html">Home</a>&nbsp;&gt;&nbsp;<a href="guides.html">Guides</a>&nbsp;&gt;&nbsp;<a href="core-developers-guide.html">Core Developers Guide</a>&nbsp;&gt;&nbsp;<a href="interceptors.html">Interceptors</a>&nbsp;&gt;&nbsp;<a href="default-workflow-interceptor.html">Default Workflow Interceptor</a>
        </td>
        <td align="right" valign="middle" nowrap>
            <form name="search" action="https://www.google.com/search" method="get">
                <input type="hidden" name="ie" value="UTF-8" />
                <input type="hidden" name="oe" value="UTF-8" />
                <input type="hidden" name="domains" value="" />
                <input type="hidden" name="sitesearch" value="" />
                <input type="text" name="q" maxlength="255" value="" />
                <input type="submit" name="btnG" value="Google Search" />
            </form>
        </td>
    </tr>
</table>

<div id="PageContent">
    <div class="pageheader" style="padding: 6px 0px 0px 0px;">
        <!-- We'll enable this once we figure out how to access (and save) the logo resource -->
        <!--img src="/wiki/images/confluence_logo.gif" style="float: left; margin: 4px 4px 4px 10px;" border="0"-->
        <div style="margin: 0px 10px 0px 10px" class="smalltext">Apache Struts 2 Documentation</div>
        <div style="margin: 0px 10px 8px 10px"  class="pagetitle">Default Workflow Interceptor</div>

        <div class="greynavbar" align="right" style="padding: 2px 10px; margin: 0px;">
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=13995">
                <img src="https://cwiki.apache.org/confluence/images/icons/notep_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Edit Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=13995">Edit Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">
                <img src="https://cwiki.apache.org/confluence/images/icons/browse_space.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Browse Space"></a>
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">Browse Space</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=13995">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_page_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=13995">Add Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=13995">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_blogentry_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add News"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=13995">Add News</a>
        </div>
    </div>

    <div class="pagecontent">
        <div class="wiki-content">
            <div id="ConfluenceContent"><p>
An interceptor that makes sure there are not validation errors before allowing the interceptor chain to continue.
<b>This interceptor does not perform any validation</b>.
</p>

<p></p><p>
This interceptor does nothing if the name of the method being invoked is specified in the <b>excludeMethods</b>
parameter. <b>excludeMethods</b> accepts a comma-delimited list of method names. For example, requests to
<b>foo!input.action</b> and <b>foo!back.action</b> will be skipped by this interceptor if you set the
<b>excludeMethods</b> parameter to "input, back".
</p>

<p></p><p>
<b>Note:</b> As this method extends off MethodFilterInterceptor, it is capable of
deciding if it is applicable only to selective methods in the action class. This is done by adding param tags
for the interceptor element, naming either a list of excluded method names and/or a list of included method
names, whereby includeMethods overrides excludedMethods. A single * sign is interpreted as wildcard matching
all methods for both parameters.
See MethodFilterInterceptor for more info.
</p>

<p></p><p>
This interceptor also supports the following interfaces which can implemented by actions:
</p>

<p></p><ul><li>ValidationAware - implemented by ActionSupport class</li><li>ValidationWorkflowAware - allows changing result name programmatically</li><li>ValidationErrorAware - notifies action about errors and also allow change result name</li></ul>

<p></p><p>
You can also use InputConfig annotation to change result name returned when validation errors occurred.
</p>


<p><b>In DefaultWorkflowInterceptor</b>
</p><p>applies only when action implements com.opensymphony.xwork2.Validateable</p>
<ol><li>if the action class have validate{MethodName}(), it will be invoked</li><li>else if the action class have validateDo{MethodName}(), it will be invoked</li><li>no matter if 1] or 2] is performed, if alwaysInvokeValidate property of the interceptor is "true" (which is by default "true"), validate() will be invoked.</li></ol>


<h2 id="DefaultWorkflowInterceptor-Parameters">Parameters</h2>

<p></p><ul><li>inputResultName - Default to "input". Determine the result name to be returned when
an action / field error is found.</li></ul>

<h2 id="DefaultWorkflowInterceptor-ExtendingtheInterceptor">Extending the Interceptor</h2>


<p></p><p>There are no known extension points for this interceptor.</p>


<h2 id="DefaultWorkflowInterceptor-Examples">Examples</h2>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[

&lt;action name=&quot;someAction&quot; class=&quot;com.examples.SomeAction&quot;&gt;
    &lt;interceptor-ref name=&quot;params&quot;/&gt;
    &lt;interceptor-ref name=&quot;validation&quot;/&gt;
    &lt;interceptor-ref name=&quot;workflow&quot;/&gt;
    &lt;result name=&quot;success&quot;&gt;good_result.ftl&lt;/result&gt;
&lt;/action&gt;

&lt;-- In this case myMethod as well as mySecondMethod of the action class
       will not pass through the workflow process --&gt;
&lt;action name=&quot;someAction&quot; class=&quot;com.examples.SomeAction&quot;&gt;
    &lt;interceptor-ref name=&quot;params&quot;/&gt;
    &lt;interceptor-ref name=&quot;validation&quot;/&gt;
    &lt;interceptor-ref name=&quot;workflow&quot;&gt;
        &lt;param name=&quot;excludeMethods&quot;&gt;myMethod,mySecondMethod&lt;/param&gt;
    &lt;/interceptor-ref name=&quot;workflow&quot;&gt;
    &lt;result name=&quot;success&quot;&gt;good_result.ftl&lt;/result&gt;
&lt;/action&gt;

&lt;-- In this case, the result named &quot;error&quot; will be used when
       an action / field error is found --&gt;
&lt;-- The Interceptor will only be applied for myWorkflowMethod method of action
       classes, since this is the only included method while any others are excluded --&gt;
&lt;action name=&quot;someAction&quot; class=&quot;com.examples.SomeAction&quot;&gt;
    &lt;interceptor-ref name=&quot;params&quot;/&gt;
    &lt;interceptor-ref name=&quot;validation&quot;/&gt;
    &lt;interceptor-ref name=&quot;workflow&quot;&gt;
       &lt;param name=&quot;inputResultName&quot;&gt;error&lt;/param&gt;
        &lt;param name=&quot;excludeMethods&quot;&gt;*&lt;/param&gt;
        &lt;param name=&quot;includeMethods&quot;&gt;myWorkflowMethod&lt;/param&gt;
    &lt;/interceptor-ref&gt;
    &lt;result name=&quot;success&quot;&gt;good_result.ftl&lt;/result&gt;
&lt;/action&gt;

]]></script>
</div></div></div>
        </div>

        
    </div>
</div>
<div class="footer">
    Generated by CXF SiteExporter
</div>
</body>
</html>
